由於三個發票類型情境,可以再拆分成兩組,
(1) 傳統發票、紙本電子發票
(2) 載具
通常發票應該可以一次存入多張,所以這邊將傳統發票、紙本電子發票歸類一組;載具每個人僅會有一組,所以不需要設計多個傳入的方法。此外,載具驗證碼需要加密,這裡需要特別實作。
async def perform_save_data(save_data):
    data_models = []
    if save_data.tag in ["invoice_paper", "invoice_trad"]:
        invoice_data = save_data.invoice
        user_data = save_data.user
        for invoice in invoice_data:
            invoice["gov"] = {
                "status": "審查中",
                "gov_status": "等待查詢中",
                "error_msg": "",
            }
            data_model = Data(
                tag=save_data.tag,
                created_timestamp=datetime.now(tz),
                updated_timestamp=datetime.now(tz),
                data={**user_data, **invoice}
            )
            data_models.append(data_model)
    elif save_data.tag == "carrier":
        carrier_data = save_data.carrier
        if 'card_encrypt' in carrier_data:
            encrypted_card = encrypt_with_salt(carrier_data['card_encrypt'])
            carrier_data['card_encrypt'] = encrypted_card
        carrier_data["gov"] = {
                "status": "審查中",
                "gov_status": "等待查詢中",
                "error_msg": "",
        }
        data_model = Data(
            tag=save_data.tag,
            created_timestamp=datetime.now(tz),
            updated_timestamp=datetime.now(tz),
            data={**carrier_data},
        )
        data_models.append(data_model)
    result = await Data.insert_many(data_models)
    inserted_ids = result.inserted_ids
    for idx, data_model in enumerate(data_models):
        setattr(data_model, 'id', str(inserted_ids[idx]))
    return data_models
最後可以嘗試打 API 看看是否成功
到目前為止,已介紹如何將發票上傳到 MongoDB
接下來更重要的是,要如何去定期更新發票資料呢?
後續將介紹 Airflow 架設以及如何寫 Dag!